/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ufes.gpf.sgm.presenter;

import edu.ufes.gpf.sgm.dao.PessoasDAOMySQL;
import edu.ufes.gpf.sgm.factoryMethodDinamico.FiltrosPessoasFactory;
import edu.ufes.gpf.sgm.model.Pessoa;
import edu.ufes.gpf.sgm.observer.Observador;
import edu.ufes.gpf.sgm.state.listarPessoas.AbstractStateListarPessoas;
import edu.ufes.gpf.sgm.state.listarPessoas.EstadoNaoSelecionadoPessoas;
import edu.ufes.gpf.sgm.state.listarPessoas.EstadoSelecionadoPessoas;
import edu.ufes.gpf.sgm.strategy.filtrosPessoas.IFiltroPessoa;
import edu.ufes.gpf.sgm.view.ListarPessoasView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Guilherme
 */
public class ListarPessoasPresenter implements Observador {

    private ListarPessoasView view;
    private PessoasDAOMySQL pessoas;
    private Pessoa pessoa;
    private AbstractStateListarPessoas estado;
    private IFiltroPessoa filtro;

    public ListarPessoasPresenter() {
        view = new ListarPessoasView();

        try {
            pessoas = PessoasDAOMySQL.getInstancia();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ListarPessoasPresenter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ListarPessoasPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

        pessoas.addObserver(ListarPessoasPresenter.this);

        view.getTblListaPessoas().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        estado = new EstadoNaoSelecionadoPessoas(this);

        view.getTblListaPessoas().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                try {
                    setEstado(new EstadoSelecionadoPessoas(ListarPessoasPresenter.this));
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(view, ex.getMessage());
                    Logger.getLogger(ListarPessoasPresenter.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });

        view.getBtnSair().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sair();
            }
        });

        view.getBtnVisualizar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                visualizar();
            }
        });

        view.getBtnNovo().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                novo();
            }
        });

        view.getBtnExcluir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                excluir();
            }
        });

        view.getTxtFiltro().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                filtrarPessoas();
            }
        });

        preencherFiltros();
        carregarListaPessoas(pessoas.buscarTodos());

        view.setTitle("Lista de Pessoas");
        view.setLocationRelativeTo(null);
        view.setVisible(true);
    }

    public ListarPessoasView getView() {
        return view;
    }

    public PessoasDAOMySQL getPessoas() {
        return pessoas;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public AbstractStateListarPessoas getEstado() {
        return estado;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public void setEstado(AbstractStateListarPessoas estado) {
        this.estado = estado;
    }

    private void novo() {
        estado.inclui();
    }

    private void visualizar() {
        estado.visualiza();
    }

    private void sair() {
        view.setVisible(false);
        view.dispose();
    }

    private void excluir() {
        estado.exclui();
    }

    private void filtrarPessoas() {
        try {
            filtro = FiltrosPessoasFactory.create(view.getCbmFiltro().getSelectedItem().toString());
            filtro.filtrar(this);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
            Logger.getLogger(ListarPessoasPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    private void preencherFiltros() {
        FiltrosPessoasFactory.carregaFiltros();
        for (Iterator<Object> it = FiltrosPessoasFactory.listaFiltros().iterator(); it.hasNext();) {
            String obj = (String) it.next();
            view.getCbmFiltro().addItem(obj.split("Pessoa")[1]);
        }
    }

    public final void carregarListaPessoas(Collection<Pessoa> pessoas) {
        DefaultTableModel dtm = (DefaultTableModel) view.getTblListaPessoas().getModel();
        dtm.setNumRows(0);
        for (Iterator<Pessoa> it = pessoas.iterator(); it.hasNext();) {
            Pessoa p = it.next();
            String linha = p.toString();
            String valores[] = linha.split("%");
            dtm.addRow(new Object[]{valores[0], valores[1], valores[2], valores[3], valores[4]});
        }

        view.getTblListaPessoas().setModel(dtm);
    }

    @Override
    public void atualizar() {
        carregarListaPessoas(pessoas.buscarTodos());
        setEstado(new EstadoNaoSelecionadoPessoas(this));
    }
}
